package gestordeentidades.persistance.interfaces;

import gestordeentidades.identitymap.interfaces.IEntityMap;
import java.util.Map;
import gestordeentidades.persistance.DataBaseObject;

/**
 * Trabalho DAS - 2014/2015
 * IPersistance interface é para ser implementado por classes que suportam 
 * a procura, actualizacao e remoção de entidades numa base de dados
 * @author a21210380, a21190325, a21210392
 */
public interface IPersistance {

    /**
     * Insere uma entidade na base de dados usando o IGateway.
     * @param <T> extends DataBaseObject para ter acesso ao id do objecto
     * @param object entidade a inserir
     * @return true como sucesso
     */
    public <T extends DataBaseObject> boolean inserirNovaEntidade(T object);

    /**
     * Actualiza uma entidade na base de dados usando o IGateway.
     * @param <T> extends DataBaseObject para ter acesso ao id do objecto
     * @param object entidade a atualizar
     * @return true como sucesso
     */
    public <T extends DataBaseObject> boolean atualizarEntidade(T object);

    /**
     * Apaga uma entidade da base de dados usando o IGateway.
     * @param <T> extends DataBaseObject para ter acesso ao id do objecto
     * @param object entidade a apagar
     * @return true como sucesso
     */
    public <T extends DataBaseObject> boolean apagarEntidade(T object);

    /**
     * Procurar uma entidade pelo id, na base de dados usando o IGateway.
     * Utiliza o IEntityMap para procurar entidades caso possam já existir em memória
     * @param <T> extends DataBaseObject para ter acesso ao id do objecto
     * @param entidade class da entidade a procurar
     * @param entityMap mapa de entidades
     * @param id da entidade a procurar
     * @return a entidade encontrada, ou null caso não seja encontrada
     */
    public <T extends DataBaseObject> T procurarEntidadePeloID(Class<T> entidade, IEntityMap entityMap, int id);

    /**
     * Procurar todas as entidades usando o IGateway.
     * @param <T> extends DataBaseObject para ter acesso ao id do objecto
     * @param entidade class das entidades a procurar
     * @param entityMap mapa de entidades
     * @return Map
     */
    public <T extends DataBaseObject> Map<Integer, T> procurarPorTodasAsEntidadesComoMapa(Class<T> entidade, IEntityMap entityMap);
    
    /**
     * Procura pelo gateway e devolve para que seja possivel manuasear o gateway directamente
     * @param <T> extends DataBaseObject, porque tem de ser uma entidade
     * @param entidade class da entidade do gateway
     * @return o respectivo gateway se existir
     */
    public <T extends DataBaseObject> IGateway<T> getGateway(Class<T> entidade);
}
